﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Globalization;
//Falta bloquear el boton guardar del DataGrid Subgrupos cuando no hallan cambios y cuando hallan errores de validacion

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMmangrups.xaml
    /// </summary>
    public partial class FRMmangrups : Window
    {
        mangrups _mangrups;

        public FRMmangrups()
        {
            InitializeComponent();
            _mangrups = (mangrups)this.DataContext;
        }
   
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _mangrups.listaGrupos();
            limpiar();
        }

        private void limpiar() {
            texCod.Text = "";
            texNom.Text = "";
           _mangrups.txtGrupo.CAMBIO = false;
        }

        string camb;
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {
            butGua2.Visibility = Visibility.Collapsed;
            butGua.Visibility = Visibility.Visible;

            if (_mangrups.txtGrupo.CODGRP_GRP != camb)
            {
                if (_mangrups.txtGrupo.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                    {
                        _mangrups.txtGrupo.CODGRP_GRP = camb;
                        return;
                    }
                    _mangrups.txtGrupo.CAMBIO = false;
                }
                camb = _mangrups.txtGrupo.CODGRP_GRP;
                _mangrups.consultar();
                if (!_mangrups.txtGrupo.EXISTE)
                {
              
                     texNom.Text = "";                   
                    _mangrups.txtGrupo.CAMBIO = false;
                }
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (_mangrups.txtGrupo.CAMBIO || _mangrups.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else{
                _mangrups.txtGrupo.CAMBIO = false;
                }
            }
        }

        private void butNue_Click(object sender, RoutedEventArgs e)
        {
            if (_mangrups.txtGrupo.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea crear un nuevo elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                {
                    return;
                }
                _mangrups.txtGrupo.CAMBIO = false;
            }
            limpiar();

            

            texCod.Focus();
            texCod.Select(0, 0);
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
              this.Close();
        }
        
        private void butEli_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea eliminar el elemento?", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel) {
                return;
            }
            _mangrups.eliminar(wPnot);

            _mangrups.listaGrupos();
            limpiar();

            texCod.Focus();
            texCod.Select(0, 0);
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            _mangrups.guardar(wPnot);

            _mangrups.listaGrupos();
            limpiar();

            //texCod.Focus();
            //texCod.Select(0, 0);
        }

        private void cm_Closed(object sender, RoutedEventArgs e)
        {
            _mangrups.filtrar();
        }

        private void quiFil_Click(object sender, RoutedEventArgs e)
        {
            _mangrups.quiFil();
        }

        private void dtGrupo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            butGua2.Visibility = Visibility.Collapsed;
            butGua.Visibility = Visibility.Visible;

            if (_mangrups.txtGrupo.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                {
                    return;
                }
                _mangrups.txtGrupo.CAMBIO = false;
            }
            if (_mangrups.selGrupo != null)
            {
                _mangrups.txtGrupo.CODGRP_GRP = _mangrups.selGrupo.CODGRP_GRP;
                _mangrups.txtGrupo.EXISTE = true;
            }
             
        }

        private void butGua2_Click(object sender, RoutedEventArgs e)
        {
            _mangrups.guardarSubg(wPnot);
        }

        private void dtSubg_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (_mangrups.Subg != null)
            {
                _mangrups.Subg.CODGRP_SUB = _mangrups.txtGrupo.CODGRP_GRP;
            }
            else {
               _mangrups.Subg = new clases.CLSMAESUB { CODGRP_SUB = _mangrups.txtGrupo.CODGRP_GRP };
            }         
        }

        private void dtSubg_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            _mangrups.CAMBIO = true;
            butGua2.Visibility = Visibility.Visible;
            butGua.Visibility = Visibility.Collapsed;
        }

        private void dtSubg_LostFocus(object sender, RoutedEventArgs e)
        {
            Boolean errors = (from c in (from object i in dtSubg.ItemsSource select dtSubg.ItemContainerGenerator.ContainerFromItem(i))
                              where c != null
                              select Validation.GetHasError(c)).FirstOrDefault(x => x);

            _mangrups.ERROR = errors;
        }

        private void texNom_TextChanged(object sender, TextChangedEventArgs e)
        {
            butGua2.Visibility = Visibility.Collapsed;
            butGua.Visibility = Visibility.Visible;
        }

        private void dtGrupo_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void dtSubg_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        } 
    }

    public class mangrups:ObservableObject 
    {

        #region propiedades
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private clases.CLSMAEGRP _txtGrupo = new clases.CLSMAEGRP();
        public clases.CLSMAEGRP txtGrupo
        {
            get { return _txtGrupo; } 
            set { _txtGrupo = value;
            RaisePropertyChangedEvent("txtGrupo");
            }
        }
        
        private clases.CLSMAEGRP _filGrupo = new clases.CLSMAEGRP { CODGRP_GRP = "", NOMGRP_GRP = ""};
        public clases.CLSMAEGRP filGrupo
        {
            get 
            {
                return _filGrupo; 
            }
            set
            {
                _filGrupo = value;
                RaisePropertyChangedEvent("filGrupo");
            }
        }

        private clases.CLSMAEGRP _selGrupo = new clases.CLSMAEGRP();
        public clases.CLSMAEGRP selGrupo
        {
            get { return _selGrupo; }
            set
            {
                _selGrupo = value;
                RaisePropertyChangedEvent("selGrupo");
             
            }
        }

        private List<clases.CLSMAEGRP> _lisGrupo = new List<clases.CLSMAEGRP>();
        public List<clases.CLSMAEGRP> lisGrupo
        {
            get { return _lisGrupo; }
            set
            {
                _lisGrupo = value;
                RaisePropertyChangedEvent("lisGrupo");
            }
        }

        private List<clases.CLSMAEGRP> _lisFilGrp = new List<clases.CLSMAEGRP>();
        public List<clases.CLSMAEGRP> lisFilGrp
        {
            get { return _lisFilGrp; }
            set
            {
                _lisFilGrp = value;
                RaisePropertyChangedEvent("lisFilGrp");
            }
        }

        private List<clases.CLSMAESUB> _lisSubg = new List<clases.CLSMAESUB>();
        public List<clases.CLSMAESUB> lisSubg
        {
            get { return _lisSubg; }
            set
            {
                _lisSubg = value;
                RaisePropertyChangedEvent("lisSubg");
            }
        }

        private clases.CLSMAESUB _Subg = new clases.CLSMAESUB();
        public clases.CLSMAESUB Subg
        {
            get {
          
                return _Subg;
            }
            set
            {
                _Subg = value;
                RaisePropertyChangedEvent("Subg");
            }
        }

        public Boolean _ERROR=false;
        public Boolean ERROR
        {
            get
            {
                return _ERROR;
            }
            set {

                _ERROR = value;
                RaisePropertyChangedEvent("ERROR");
            }

        }

        public Boolean _CAMBIO = false;
        public Boolean CAMBIO
        {
            get
            {
                return _CAMBIO;
            }
            set
            {

                _CAMBIO = value;
                RaisePropertyChangedEvent("CAMBIO");
            }

        }

        #endregion

        #region metodos

        public mangrups()
        {
            MDOgeneral.conectar();
            strTituloVentana = "Grupos y subgrupos - Usuario: " + MDOgeneral.usuario + " - [FRMmangrups]";
        }

        public void listaGrupos()
        {
            try
            {
                lisGrupo = selGrupo.listaGrupos();
                lisFilGrp = lisGrupo;
            }
            catch (Exception ex) {MessageBox.Show(ex.Message);}
        }
        
        public void guardar(WrapPanel wPnot)
        {
            try
            {
                if (txtGrupo.EXISTE)
                {
                    if (txtGrupo.actualizar() > 0)
                    {
                        txtGrupo.CAMBIO = false;
                        lisGrupo.Clear();
                        lisGrupo = txtGrupo.listaGrupos();
                        filtrar();
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
                else
                {
                    if (txtGrupo.insertar() > 0)
                    {
                        txtGrupo.CAMBIO = false;
                        txtGrupo.EXISTE = true;
                        lisGrupo.Clear();
                        lisGrupo = txtGrupo.listaGrupos();
                        filtrar();                       
                        new MDOgeneral.notificar(wPnot, "El elemento fue creado satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "El elemento no puede ser creado.", false);
                    }
                }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void guardarSubg(WrapPanel wPnot)
        {

            try{

            Boolean sw = true;

            for (int i = 0; i <= lisSubg.Count - 1; i++)
            {

                if (lisSubg[i].CAMBIO)
                {

                    if (lisSubg[i].ELIMINAR==true && lisSubg[i].EXISTE==true)
                    {
                        if (lisSubg[i].eliminar() <= 0)
                        {

                            sw = false;
                        }
                    }
                    else
                    {
                        if (lisSubg[i].ELIMINAR == false)
                        {

                            if (lisSubg[i].existe() == true)
                            {

                                if (lisSubg[i].actualizar() <= 0)
                                {

                                    sw = false;
                                }
                            }
                            else
                            {
                                if (lisSubg[i].insertar() <= 0)
                                {

                                    sw = false;
                                }
                            }
                        }
                    }

                }
            }

                if (sw)
                {
                    CAMBIO = false;
                    new MDOgeneral.notificar(wPnot, "Los cambios en los Subgrupos fueron almacenados .", true);
                }
                else
                {

                    new MDOgeneral.notificar(wPnot, "Algunos cambios en los Subgrupos no pudieron ser alamcenados.", false);
                }

                lisSubg = new clases.CLSMAESUB { CODGRP_SUB = txtGrupo.CODGRP_GRP }.listaSubg();

            }catch(Exception ex){ MessageBox.Show(ex.Message);}


        }
   
        public void eliminar(WrapPanel wPnot)
        {
            try
            {
                if (txtGrupo.eliminar() > 0)
                {
                    txtGrupo.CAMBIO = false;
                    lisGrupo.Clear();
                    lisGrupo = txtGrupo.listaGrupos();
                    filtrar();
                    new MDOgeneral.notificar(wPnot, "El elemento ha sido eliminado satisfactoriamente.", true);
                }
                else
                {
                    new MDOgeneral.notificar(wPnot, "El elemento no puede ser eliminado.", false);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }     
        }

        public void filtrar() 
        {
            //lisFilGrp = lisGrupo.FindAll
            //    (r => 
            //        r.CODGRP_GRP.ToUpper().Contains(filGrupo.CODGRP_GRP.ToUpper()) &
            //        r.NOMGRP_GRP.ToUpper().Contains(filGrupo.NOMGRP_GRP.ToUpper()) 
            //    );
            //lisFilGrp.Add(new clases.CLSMAEGRP { CODGRP_GRP = "", NOMGRP_GRP = "" });
        }

        public void quiFil()
        {
            filGrupo = new clases.CLSMAEGRP { CODGRP_GRP = "", NOMGRP_GRP = "" };
            lisFilGrp = lisGrupo;
        }

        public void consultar() {
        
            txtGrupo.consultar();
            if (txtGrupo.EXISTE)
            {
               lisSubg= new clases.CLSMAESUB { CODGRP_SUB = txtGrupo.CODGRP_GRP }.listaSubg();
               Subg = new clases.CLSMAESUB { CODGRP_SUB = txtGrupo.CODGRP_GRP };
               
            }
            else {
                lisSubg = new List<clases.CLSMAESUB>();
                CAMBIO = false;
                Subg = new clases.CLSMAESUB();
            }        
        }

        #endregion

    }


      

}
